package org.duiduo.common.tool.util;

import com.jcraft.jsch.*;
import lombok.extern.slf4j.Slf4j;

import java.io.FileInputStream;
import java.util.Properties;

/**
 * sftp上传文件工具类
 *
 * @author liangze
 * @date 2024/11/4 15:43
 */
@Slf4j
public class SftpSendUtil {

    private static ChannelSftp sftp;

    /**
     * 上传易生文件
     *
     * @param host        远程地址
     * @param port        远程端口
     * @param user        登陆名
     * @param pwd         密码
     * @param sftpDir     远程目录
     * @param inputStream 输入流
     * @param fileName    文件名
     */
    public static void ftpUpload(String host, String port, String user, String pwd,
                                 String sftpDir, FileInputStream inputStream, String fileName) {
        log.info("sftp连接信息-地址:{}", host);
        log.info("sftp连接信息-端口:{}", port);
        log.info("sftp连接信息-用户:{}", user);
        log.info("sftp连接信息-密码:{}", pwd);
        log.info("sftp传输信息-远程目录:{}", sftpDir);
        log.info("sftp传输信息-输入流:{}", inputStream);
        log.info("sftp传输信息-文件名:{}", fileName);
        try {
            // 连接sftp
            JSch jsch = new JSch();
            jsch.getSession(user, host, Integer.parseInt(port));
            Session sshSession = jsch.getSession(user, host, Integer.parseInt(port));
            sshSession.setPassword(pwd);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            log.info("SFTP Session connected.");
            Channel channel = sshSession.openChannel("sftp");
            channel.connect();
            sftp = (ChannelSftp) channel;
            log.info("Connected to " + host);

            try {
                sftp.cd(sftpDir);
            } catch (SftpException e) {
                log.info("文件目录不存在重新建立文件夹");
                sftp.mkdir(sftpDir);
                sftp.cd(sftpDir);
            }

            log.info("当前目录:{}", sftp.pwd());
            // 开始上传文件
            sftp.put(inputStream, fileName);
            log.info(fileName + " 文件上传成功");
        } catch (Exception e) {
            log.info("报错文件名称：{}", fileName);
            throw new RuntimeException(e.getMessage());
        }
    }

    public static void disconnect() {
        try {
            sftp.getSession().disconnect();
        } catch (JSchException e) {
            log.error(e.getMessage());
        }
        sftp.quit();
        sftp.disconnect();
    }
}
